Spring Cloud—四、Spring Cloud快速入门

Author Avatar
zuoqy 11月 14, 2018
  • 在其它设备中阅读本文章

4.1、分析硬编码的问题

通过前面3.4的实现,我们似乎已经解决了url硬编码的问题,但是我们想想:
1、如果商品微服务的ip地址发生了变更,订单微服务中的配置文件也需要跟着修改
2、如果商品微服务有多个,那么在订单微服务中又该如何写地址?
那应该怎么解决呢? - 通过服务注册、发现的机制来完成。

4.2、微服务注册与发现

原理示意图:
原理示意图.png

由上图可以看出:
1.服务提供者将服务注册到注册中心。
2.服务消费者通过注册中心查找服务。
3.差找到服务后进行调用(这里就是无需硬编码url的解决方案)
4.服务的消费者与服务注册中心保持心跳连接,一旦服务提供者的地址发生变更时,注册中心会通知服务消费者。

4.3、注册中心Eureka

Spring Cloud提供了多种注册中心的支持,如:Eureka、Zookeeper等。推荐使用Eureka。
Eureka.png

4.3.1、原理

原理.png
Eureka包含两个组件:Eureka Server和Eureka Client。

Eureka Server提供服务注册服务,各个节点启动后,会在Eureka Server中进行注册,这样Eureka Server中的服务注册表中将会存储所有可用服务节点的信息,服务节点的信息可以在界面中直观的看到。

Eureka Client是一个JAVA客户端,用于简化与Eureka Server的交互,客户端同时也就别一个内置的、使用轮询(round-robin)负载算法的负载均衡器。

在应用启动后,将会向Eureka Server发送心跳,默认周期为30秒,如果Eureka Server在多个心跳周期内没有接收到某个节点的心跳,Eureka Server将会从服务注册表中把这个服务节点移除(默认90秒)。

Eureka Server之间通过复制的方式完成数据的同步,Eureka还提供了客户端缓存机制,即使所有的Eureka Server都挂掉,客户端依然可以利用缓存中的信息消费其他服务的API。综上,Eureka通过心跳检查、客户端缓存等机制,确保了系统的高可用性、灵活性和可伸缩性。

4.3.2、编写Eureka Server

第一步,创建工程springcloud-demo-eureka:(同3.1.1)
第二步,导入依赖:这里需要导入Spring Cloud的管理依赖。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!-- 导入Spring Cloud的依赖管理 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

<!-- 导入Eureka服务 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>

第三步,声明这是一个Eureka服务声明.png
第四步,编写application.properties配置文件:
application.properties.png
第五步,启动程序做测试
测试结果.png

4.3.3、将商品微服务注册到Eureka

接下来,我们需要将商品的微服务注册到Eureka服务中。
第一步,修改pom文件,引入Spring Cloud的管理依赖以及eureka服务依赖。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<!-- 导入Spring Cloud的依赖管理 -->
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-dependencies</artifactId>
<version>Dalston.SR3</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>

<!-- 导入Eureka服务 -->
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
</dependency>

第二步,修改application.properties配置文件
application.properties.png
第三步,启动类中,增加@EnableDiscoveryClient注解:
EnableDiscoveryClient.png
第四步,启动测试:
结果.png

至此,我们以及将自己的微服务注册到Eureka Server中了。

4.3.4、订单系统从Eureka发现服务

之前我们在订单系统中是将商品微服务的地址进行了硬编码,现在,由于已经将商品服务注册到Eureka中,所以,只需要从Eureka中发现服务即可。

第一步,在订单系统中添加依赖(同4.3.3第一步)
第二步,修改application.properties配置文件
application.properties.png
第三步,修改ItemServie的实现逻辑:

1
2
3
4
5
6
7
8
9
10
public Item queryItemById(Long id) {
String sericeId = "springcloud-demo-item";
// 获取一个实例
List<ServiceInstance> instances = this.discoveryClient.getInstances(sericeId);
if (instances.isEmpty()) {return null;}
ServiceInstance instance = instances.get(0);

String url = "http://" + instance.getHost() + ":" + instance.getPort() + "/item/query/" + id;
return this.restTemplate.getForObject(url,Item.class);
}

第四步,在启动类中添加@EnableDiscoveryClient注解
EnableDiscoveryClient.png
第五步,启动测试
我们发现返回结构是xml,这是由于我们引入了eureka server的依赖,导致破坏了之前Sring Mvc默得配置,从而导致了响应成了xml。

解决方法:排除eureka server中的xml依赖,如下:

1
2
3
4
5
6
7
8
9
10
<dependency>
<groupId>org.springframework.cloud</groupId>
<artifactId>spring-cloud-starter-eureka-server</artifactId>
<exclusions>
<exclusion>
<groupId>com.fasterxml.jackson.dataformat</groupId>
<artifactId>jackson-dataformat-xml</artifactId>
</exclusion>
</exclusions>
</dependency>

测试结果:
结果.png


出自:zuoqy博客
如若转载请注明出处!